
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#define FMTSTRSIZE 255
#define TIMESTRSIZE 1024

int main(int argc, char **argv) {
    FILE *fp = stdout;
    time_t stamp;
    struct tm *tm;
    char timestr[TIMESTRSIZE];
    int c;
    char fmtstr[FMTSTRSIZE];
    fmtstr[0] = '\0';

    // 获取当前时间
    stamp = time(NULL);
    tm = localtime(&stamp);

    // 解析命令行选项
    while (1) {
        c = getopt(argc, argv, "-H:MSy:md"); // getopt会返回选项字符，如果是-后面跟数字则是1
        if (c < 0)
            break;

        switch (c) {
            case 1:
                fp = fopen(argv[optind - 1], "w"); // optind储存读到第几个参数的下标，读到文件地址时返回1，然后optind指向了下一个，所有要减一就是文件地址的参数
                if (fp == NULL) {
                    perror("fopen()");
                    fp = stdout;
                }
                break;
            case 'H': // 小时，24小时制
                if (strcmp(optarg, "12") == 0)
                    strncat(fmtstr, " %I(%P)", FMTSTRSIZE);
                else if (strcmp(optarg, "24") == 0)
                    strncat(fmtstr, " %H", FMTSTRSIZE);
                else
                    fprintf(stderr, "Invalid argument of -H\n");
                break;
            case 'M': // 分钟
                strncat(fmtstr, " %M", FMTSTRSIZE);
                break;
            case 'S': // 秒
                strncat(fmtstr, " %S", FMTSTRSIZE);
                break;
            case 'y': // 年份
                if (strcmp(optarg, "2") == 0)
                    strncat(fmtstr, " %y", FMTSTRSIZE);
                else if (strcmp(optarg, "4") == 0)
                    strncat(fmtstr, " %Y", FMTSTRSIZE);
                else
                    fprintf(stderr, "Invalid argument of -y\n");
                break;
            case 'm': // 月份
                strncat(fmtstr, " %m", FMTSTRSIZE);
                break;
            case 'd': // 日
                strncat(fmtstr, " %d", FMTSTRSIZE);
                break;
            default:
                fprintf(stderr, "Invalid option: %c\n", optopt);
                return 1;
        }
    }

    // 初始化时间字符串
    strncat(fmtstr, "\n", FMTSTRSIZE); // fputs不会自动换行，加个\n
    strftime(timestr, TIMESTRSIZE, fmtstr, tm);
    fputs(timestr, fp);

    if (fp != stdout)
        fclose(fp);

    exit(0);
}
